/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Juegos;

import Estados.*;

/**
 *
 * @author Jesus
 */


public class LoboColOveja extends Juego{

    


    public LoboColOveja(Estado ini){
        super(ini,4);

    }

    public eLobo mueveGranjero(eLobo e){
            int[] situacion = e.getSituacion();
            situacion[0] = (situacion[0] == 0) ? 1 : 0;
            return new eLobo(situacion);
    }

    public eLobo mueveLobo(eLobo e){
            int[] situacion = e.getSituacion();
            situacion[1] = (situacion[0] == 0) ? 1 : 0;
            return new eLobo(situacion);
    }

    public eLobo mueveCol(eLobo e){
            int[] situacion = e.getSituacion();
            situacion[2] = (situacion[0] == 0) ? 1 : 0;
            return new eLobo(situacion);
    }

    public eLobo mueveOveja(eLobo e){
            int[] situacion = e.getSituacion();
            situacion[3] = (situacion[0] == 0) ? 1 : 0;
            return new eLobo(situacion);
    }


    public eLobo operar(int x, Estado in) {
        eLobo siguiente = null;
        eLobo actual = new eLobo(in);
	switch(x){
            case 0:
                    siguiente = mueveLobo(actual);
                    if(siguiente!=null) siguiente.setCoste(actual.getCoste() + 1);
                    break;
            case 1:
                    siguiente = mueveCol(actual);
                    if(siguiente!=null) siguiente.setCoste(actual.getCoste() + 1);
                    break;
            case 2:
                    siguiente = mueveOveja(actual);
                    if(siguiente!=null) siguiente.setCoste(actual.getCoste() + 1);
                    break;
            case 3:
                    siguiente = mueveGranjero(actual);
                    if(siguiente!=null) siguiente.setCoste(actual.getCoste() + 1);
                    break;
	}
	if ((siguiente != null) && (esPeligro(siguiente))){
		return null;
	}
	return siguiente;
    }

    public boolean esInicial(eLobo e) {
        int[] situacion=e.getSituacion();
        return situacion[0]==0 && situacion[1]==0 && situacion[2]==0 && situacion[3]==0;
    }


    public boolean esFinal(eMisioneros e) {
        int[] situacion=e.getSituacion();
        return situacion[0]==1 && situacion[1]==1 && situacion[2]==1 && situacion[3]==1;
    }


    public boolean esPeligro(Estado o) {
        eLobo e= (eLobo) o;
        int[] situacion=e.getSituacion();
        return ((situacion[1] == situacion[3]) && (situacion[1] != situacion[0]))
            || ((situacion[2] == situacion[3]) && (situacion[2] != situacion[0]));
    }

    @Override
    public boolean esInicial(Estado o) {
        eLobo e=(eLobo) o;
        int[] situacion=e.getSituacion();
        return situacion[0]==0 && situacion[1]==0 && situacion[2]==0 && situacion[3]==0;
    }

    @Override
    public boolean esFinal(Estado o) {
        eLobo e= (eLobo) o;
        int[] situacion=e.getSituacion();
        return situacion[0]==1 && situacion[1]==1 && situacion[2]==1 && situacion[3]==1;
    }

}
